const db = require('../db/index');
const bcryptjs = require('bcryptjs'); // 密码加密包 也用于逆向比较密码是否一致
const jwt = require('jsonwebtoken'); // 生成Token字符串
// 定义用户注册服务器处理函数
regUser = (req, res) => {
    // 1、检测表单数据是否合法
    // 获取客户端传送过来的请求体数据
    const userinfo = req.body;
    // if (!userinfo.username || !userinfo.password) {
    //     return res.send({
    //         status: 1,
    //         message: '用户名或密码不能为空！'
    //     })
    // }
    // 2、检测用户名是否被占用
    // 2.1定义sql语句 查询用户名
    const sqlCheck = 'select * from ev_users where username = ?';
    db.query(sqlCheck, userinfo.username, (err, results) => {
        if (err) return res.cc(err);
        if (results.length > 0) {
            return res.cc('用户名被占用！');
        };
        // 3、对密码进行加密处理
        // console.log(userinfo.password);
        userinfo.password = bcryptjs.hashSync(userinfo.password, 10);
        // console.log(userinfo.password);
        // 4、插入新用户
        // const sqlAdd = 'insert into ev_user set ?'; // 整个占位符要传的参数是对象
        const sqlAdd = 'insert into ev_users (username,password) values (?,?)'; // 这个占位符要传的参数是数组
        db.query(sqlAdd, [userinfo.username, userinfo.password], (err, results) => {
            // err 报错提示
            if (err) return res.cc(err);
            // results 报错提示
            if (results.affectedRows !== 1) return res.cc('注册失败，请稍后再试!');
            // err 和 results 验证都通过后 就证明数据添加成功
            res.send({ status: 0, message: '添加用户成功！' });
        });
    });

    // res.send('register ok');
};
// 定义用户登录服务器处理函数
loginUser = (req, res) => {
    // 检测表单数据是否合法
    // 检测数据库是否有这个用户的信息
    const userinfo = req.body;
    // console.log(userinfo);
    const sqlStr = 'select * from ev_users where username=?';
    db.query(sqlStr, userinfo.username, (err, results) => {
        // sql语句错误信息抓取
        if (err) return res.cc(err);
        console.log(results[0]);
        // 判断数据库中是否有请求的用户信息 
        if (results.length === 0) return res.cc('没有该用户信息，登录失败！');
        // 判断用户密码是否正确
        const compareResult = bcryptjs.compareSync(userinfo.password, results[0].password);
        // console.log(compareResult);
        if (!compareResult) return res.cc('密码错误，登录失败！');
        // 生成Token字符串并返回给客户端
        // 核心注意点：在生成 Token 字符串的时候，出于安全性考虑，一定要剔除 密码 和 头像 的值
        const userUnlessSecret = {...results[0], password: '', user_pic: '' }; // 对象的结构赋值 
        console.log(userUnlessSecret);
        // 定义加密密钥secretKey 这里通过模块形式来处理
        const config = require('../schema/config');
        // 生成Token字符串
        const tokenStr = jwt.sign(userUnlessSecret, config.secretKey, { expiresIn: config.expiresIn });
        // console.log(tokenStr);
        // 把生成的Token字符串响应给客户端
        res.send({
            status: 0,
            message: '登录成功！',
            token: 'Bearer ' + tokenStr // 为了方便客户端调用token 在服务器端直接拼接上Bearer的前缀 注意加空格
        });
        // 解析token
    });
    // res.send('login ok');
};



// 将这两个函数挂载到m.e对象 向外暴漏
// 方法一
// module.exports = {
//     regUser,
//     loginUser
// }
// 方法二
module.exports.loginUser = loginUser;
module.exports.regUser = regUser;